package login

import (
	"context"
	v1 "donkey-admin/api/role/v1"
	"donkey-admin/internal/dao"
	"donkey-admin/internal/model/do"
	"donkey-admin/internal/model/entity"
	casbin "donkey-admin/utility"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/google/uuid"
)

func (s *sRole) RoleUpdatePermission(ctx context.Context, req *v1.RoleUpdatePermissionReq) (res *v1.RoleUpdatePermissionRes, err error) {

	err = g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {

		var a []entity.SysApis
		err = dao.SysApis.Ctx(ctx).TX(tx).Where("uuid", req.ApiUuids).Scan(&a)
		if err != nil {
			g.Log().Error(ctx, err)
			return err
		}

		_, err = dao.CasbinRule.Ctx(ctx).TX(tx).Where("v0", req.RoleCode).Delete()
		if err != nil {
			g.Log().Error(ctx, err)
			return err
		}

		for _, v := range a {
			if _, err = dao.CasbinRule.Ctx(ctx).TX(tx).Insert(&do.CasbinRule{
				Ptype: "p",
				V0:    req.RoleCode,
				V1:    v.ApiPath,
				V2:    v.ApiMethod,
			}); err != nil {
				g.Log().Error(ctx, err)
			}
		}

		_, err = dao.SysRoleMenu.Ctx(ctx).TX(tx).Unscoped().Where("role_code", req.RoleCode).Delete()
		if err != nil {
			g.Log().Error(ctx, err)
			return err
		}

		for _, v := range req.MenuUuids {
			if _, err = dao.SysRoleMenu.Ctx(ctx).TX(tx).Insert(&do.SysRoleMenu{
				Uuid:     uuid.New().String(),
				RoleCode: req.RoleCode,
				MenuId:   v,
			}); err != nil {
				g.Log().Error(ctx, err)
			}
		}

		return err
	})

	if err != nil {
		g.Log().Error(ctx, err)
		return nil, err
	}

	err = casbin.CasbinUtils.Casbin(ctx).LoadPolicy()
	if err != nil {
		g.Log().Error(ctx, err)
	}

	return &v1.RoleUpdatePermissionRes{}, nil
}
